package br.ufg.inf.sd.truco;

import java.util.Random;

/**
 * Estra classe representa um baralho do jogo do truco.
 * @author Egio Arruda Junior &André Vilas Boas.
 * @version 1.0
 */

public class Baralho {
	
	private Carta[] vetor;		//vetos das cartas
	/**
	 * Contrutor padrão da classe que inicializa o valor de todsa as cartas
	 */
	public Baralho(){
		vetor = new Carta[27];
		constroeBaralho();
	}
	
	/**
	 * Este método tem a função de construir o baralho a ser utilizado durante o jogo.
	 */
	private void constroeBaralho(){
		//setar carta a carta
		for(int i = 0; i < 27; i++)
		    vetor[i] = new Carta();
		
		//dama de paus
		vetor[0].setNome("dama");
		vetor[0].setNipe("paus");
		vetor[0].setValor(1);
		vetor[0].setSelecionada(false);

		
		//dama de copas
		vetor[1].setNome("dama");
		vetor[1].setNipe("copas");
		vetor[1].setValor(1);
		vetor[1].setSelecionada(false);
		
		//dama de ouro
		vetor[2].setNome("dama");
		vetor[2].setNipe("ouro");
		vetor[2].setValor(1);
		vetor[2].setSelecionada(true);;
		
		//dama de espada
		vetor[3].setNome("dama");
		vetor[3].setNipe("espada");
		vetor[3].setValor(1);
		vetor[3].setSelecionada(false);
		
		//valete de paus
		vetor[4].setNome("valete");
		vetor[4].setNipe("paus");
		vetor[4].setValor(2);
		vetor[4].setSelecionada(false);
		
		//valete de copas
		vetor[5].setNome("valete");
		vetor[5].setNipe("copas");
		vetor[5].setValor(2);
		vetor[5].setSelecionada(false);
		
		//valete de ouro
		vetor[6].setNome("valete");
		vetor[6].setNipe("ouro");
		vetor[6].setValor(2);
		vetor[6].setSelecionada(false);
		
		//valete de espada
		vetor[7].setNome("valete");
		vetor[7].setNipe("espada");
		vetor[7].setValor(2);
		vetor[7].setSelecionada(false);
		
		//rei de paus
		vetor[8].setNome("rei");
		vetor[8].setNipe("paus");
		vetor[8].setValor(3);
		vetor[8].setSelecionada(false);
		
		//rei de copas
		vetor[9].setNome("rei");
		vetor[9].setNipe("copas");
		vetor[9].setValor(3);
		vetor[9].setSelecionada(false);
		
		//rei de ouro
		vetor[10].setNome("rei");
		vetor[10].setNipe("ouro");
		vetor[10].setValor(3);
		vetor[10].setSelecionada(false);
		
		//rei de espada
		vetor[11].setNome("rei");
		vetor[11].setNipe("espada");
		vetor[11].setValor(3);
		vetor[11].setSelecionada(false);
		
		//as de paus
		vetor[12].setNome("as");
		vetor[12].setNipe("paus");
		vetor[12].setValor(4);
		vetor[12].setSelecionada(false);
		
		//as de copas
		vetor[13].setNome("as");
		vetor[13].setNipe("copas");
		vetor[13].setValor(4);
		vetor[13].setSelecionada(false);
		
		//as de ouro
		vetor[14].setNome("as");
		vetor[14].setNipe("ouro");
		vetor[14].setValor(4);
		vetor[14].setSelecionada(false);
		
		//as de espada
		vetor[15].setNome("as");
		vetor[15].setNipe("espada");
		vetor[15].setValor(8);		
		vetor[15].setSelecionada(false);
		
		//dois de paus
		vetor[16].setNome("dois");
		vetor[16].setNipe("paus");
		vetor[16].setValor(5);
		vetor[16].setSelecionada(false);
		
		//dois de copas
		vetor[17].setNome("dois");
		vetor[17].setNipe("copas");
		vetor[17].setValor(5);
		vetor[17].setSelecionada(false);
		
		//dois de ouro
		vetor[18].setNome("dois");
		vetor[18].setNipe("ouro");
		vetor[18].setValor(5);
		vetor[18].setSelecionada(false);
		
		//dois de espada
		vetor[19].setNome("dois");
		vetor[19].setNipe("espada");
		vetor[19].setValor(5);
		vetor[19].setSelecionada(false);
		
		//tres de paus
		vetor[20].setNome("tres");
		vetor[20].setNipe("paus");
		vetor[20].setValor(6);
		vetor[20].setSelecionada(false);
		
		//tres de copas
		vetor[21].setNome("tres");
		vetor[21].setNipe("copas");
		vetor[21].setValor(6);
		vetor[21].setSelecionada(false);
		
		//tres de ouro
		vetor[22].setNome("tres");
		vetor[22].setNipe("ouro");
		vetor[22].setValor(6);
		vetor[22].setSelecionada(false);
		
		//tres de espada
		vetor[23].setNome("tres");
		vetor[23].setNipe("espada");
		vetor[23].setValor(6);
		vetor[23].setSelecionada(false);
		
		//sete de copas
		vetor[24].setNome("sete");
		vetor[24].setNipe("copas");
		vetor[24].setValor(9);
		vetor[24].setSelecionada(false);
		
		//sete de ouro
		vetor[25].setNome("sete");
		vetor[25].setNipe("ouro");
		vetor[25].setValor(7);
		vetor[25].setSelecionada(false);
		
		//zap
		vetor[26].setNome("zap");
		vetor[26].setNipe("paus");
		vetor[26].setValor(10);
		vetor[26].setSelecionada(false);

	}

	/**
	 * Este método é responsável por retornar uma determinada carta de acordo com o index dado.
	 * @param index index da carta no baralho (o baralho é representado por um vetor).
	 * @return se o índice for válido retorna uma determinada carta. Caso contrário retorna null.
	 */
	public Carta getCarta(int index) {
		if(index > 26)
			return null;
		return vetor[index];
	}

	/**
	 * Este método é responsável por setar uma carta em uma dada posição no baralho.
	 * @param carta carta a ser colocada no baralho.
	 * @param index índice onde a carta deverá ser colocada.
	 */
	public void setCarta(Carta carta, int index) {
		vetor[index] = carta;
	}
	
	/**
	 * Este método é responsável por distribuir uma mão de cartas.
	 * @return três cartas.
	 */
	public Carta[] distribuirCartas(){
		Random random = new Random();
		Carta[] rand = new Carta[3];
		int sorteio = 0;
		int countCarta = 0;
		while(countCarta < 3){
			sorteio = random.nextInt(27);			//gera numeros positivos e aleatórios entre 0 e 26.
			if(!vetor[sorteio].isSelecionada()){
				rand[countCarta] = vetor[sorteio];
                vetor[sorteio].setSelecionada(true);
				countCarta++;
			}
		}
		return rand;
	}
	
	/**
	 * Este método desmarca todas as cartas já selecionada.
	 */
	public void resetBaralho(){
		for(int i = 0; i < vetor.length; i++){
			vetor[i].setSelecionada(false);
		}
	}
	
	public void toString(Carta carta){
		System.out.println("\nImpressão da carta");
		System.out.println("Nome da carta: " + carta.getNome());
		System.out.println("Nipe da carta: " + carta.getNipe());
		System.out.println("Valor da carta: " + carta.getValor());
		System.out.println("Acarta já foi dada? " + carta.isSelecionada());
	}
}
